package com.yxw.asyncload;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.util.LruCache;
import android.widget.ImageView;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * 专门处理图片的加载
 */
public class ImageLoader {

    private ImageView mImageView;
    private String mUrl;
    //创建cache
    //key/value的参数类型，key就是缓存图像的名字，当然是以url作为他的名字进行保村，value自然是要保存的对象Bitmap
    private LruCache<String, Bitmap> mCache;

    public ImageLoader() {

        /*
        初始化Lrucache，在使用lru之前，需要设定一个可用的范围，并不可能将所有内存全部作为
        缓存，将一部分内存转化为缓存空间，首先获取一个当前应用可用的内存大小，然后设定一个可用的缓存的大小
         */
        int maxMemory = (int) Runtime.getRuntime().maxMemory();
        int cacheSize = maxMemory / 4;

        //初始化Lru
        mCache = new LruCache<String, Bitmap>(cacheSize) {
            /*
            这个方法用于获取每一个存进去的对象他的一个大小，我们必须重写这个方法去加载正确的内存大小，
            不然他默认返回的是元素的个数，这是不对的
            sizeOf方法在每次加入内存缓存的时候进行调用，我们需要在每次加入缓存的时候
            给他一个准确的大小，也就是bitmap大小
             */
            @Override
            protected int sizeOf(String key, Bitmap value) {
                //在每次存入缓存的时候调用
                return value.getByteCount();
            }
        };

    }

    /*
    使用缓存之前要动用两个方法，将内容保存到lrucache，和从lrucache中获取指定的内容
     */
    public void addBitmapToCache(String url, Bitmap bitmap) {
        if (getBitmapFromCache(url) == null) {
            mCache.put(url, bitmap);
        }
    }

    public Bitmap getBitmapFromCache(String url) {
        return mCache.get(url);
    }

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            /*
            在获取图片的时候进行判断，
             */
            if (mImageView.getTag().equals(mUrl)) {
                mImageView.setImageBitmap((Bitmap) msg.obj);
            }

        }

    };

    public void showImageByThread(ImageView imageView, final String url) {
        mImageView = imageView;
        mUrl = url;
        new Thread() {
            @Override
            public void run() {
                super.run();
                Bitmap bitmap = getBitMapFromURL(url);
               /*
               在子线程中，将这个bitmap以message的形式发送出去，让handleManager进行处理
                */
                Message message = Message.obtain();
                message.obj = bitmap;
                mHandler.sendMessage(message);
            }
        }.start();
    }

    /**
     * 用于从url获取bitmap
     */
    public Bitmap getBitMapFromURL(String urlString) {
/*
在java中凡是跟网络相关的都要捕获异常
 */
        Bitmap bitmap;
        InputStream is = null;
        try {
            URL url = new URL(urlString);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            is = new BufferedInputStream(connection.getInputStream());
            bitmap = BitmapFactory.decodeStream(is);
            /*
            这个原因在于ListView
             */
            //  Thread.sleep(1000);
            connection.disconnect();
           // Thread.sleep(1000);
            return bitmap;
        } catch (IOException e) {
            e.printStackTrace();
        }  finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
        return null;
    }


    public void showImageByAsyncTask(ImageView imageView, String url) {

//从缓存中取出图片
        Bitmap bitmap = getBitmapFromCache(url);
        if (bitmap == null) {
            //如果缓存没有就去下载
            new NewsAsyncTask(imageView, url).execute(url);
        } else {
            mImageView.setImageBitmap(bitmap);
        }


    }

    private class NewsAsyncTask extends AsyncTask<String, Void, Bitmap> {
        private ImageView mImageView;
        private String mUrl;

        public NewsAsyncTask(ImageView imageView, String url) {
            mImageView = imageView;
            mUrl = url;
        }

        @Override
        protected Bitmap doInBackground(String... params) {
            String url = params[0];
            //从网络获取图片
            //下面写错了，应该是调用 getBitmapFromUrl
           // Bitmap bitmap = getBitmapFromCache(url);
            Bitmap bitmap = getBitMapFromURL(url);
            if (bitmap != null) {
                //将不再缓存的图片加入缓存，从而实现一个缓存效果
                //将url对应的bitmap保存到混村里
                addBitmapToCache(url, bitmap);
            }
            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            if (mImageView.getTag().equals(mUrl)) {
                mImageView.setImageBitmap(bitmap);
            }

        }
    }
}
